import { nextTick } from 'vue'
import convertTime from '@/utils/convertTime'
// 引入
import FileSaver from 'file-saver'
import * as XLSX from 'xlsx'
import XLSXS from 'xlsx-style-vite'

// 导出表格
function exportTableData(tableId:string,fileName:string){
  nextTick(function () {
    const filename = `${fileName}-${convertTime(new Date())[1]}.xlsx`
    const xlsxParam = { raw: true } //转化成Excel使用原始格式
    const elTable = XLSX.utils.table_to_book(document.getElementById(tableId), xlsxParam)
    console.log('表格名称--------->', filename)

    // const tableData = [
    //   [ '第一行第一列', '第一行第二列', '第一行第三列' ],
    //   [ '第二行第一列', '第二行第二列', '第二行第三列' ],
    //   [ '第三行第一列', '第三行第二列', '第三行第三列' ]
    // ]
    // const wsa = XLSX.utils.aoa_to_sheet(tableData)
    // const wb = XLSX.utils.book_new()
    // XLSX.utils.book_append_sheet(wb, wsa, '数据表')

    xlsxAddStyle(elTable.Sheets.Sheet1, 20)
    // xlsxAddStyle(wsa, 20)
    
    const wopts = {
      bookType: 'xlsx', // 要生成的文件类型
      bookSST: true, // 是否生成Shared String Table，官方解释是，如果开启生成速度会下降，但在低版本IOS设备上有更好的兼容性
      type: 'binary'
    }
    const ws = XLSXS.write(elTable, wopts)
    
    // const wbout = XLSX.write(ws, { bookType: 'xlsx', bookSST: true, type: 'array' })
    try {
      FileSaver.saveAs(new Blob([ s2ab(ws) ], { type: 'application/octet-stream' }), filename)
    } catch (e) {
      if (typeof console !== 'undefined') {
        console.log(e, ws)
      }
    }
    return ws
  })
}

// 自定义样式
function xlsxAddStyle(sheet:any, rowCLength:any) {
  console.log('参数-----》', sheet)
  for (const key in sheet) {
    sheet['!cols'].push({
      wpx: 180
    })
    if (Object.hasOwnProperty.call(sheet, key)) {
      const element = sheet[key]
      if (typeof element === 'object') {
        const index = Number(letter(key)) - 1
        element.s = {
          alignment: {
            horizontal: 'center', // 所有单元格水平居中
            vertical: 'center' // 所有单元格垂直居中
          },
          font: {
            name: '宋体',
            sz: 16,
            italic: false,
            underline: false
          },
          border: {
            top: {
              style: 'thin',
              color: {
                auto: 1
              }
            },
            left: {
              style: 'thin',
              color: {
                auto: 1
              }
            },
            right: {
              style: 'thin',
              color: {
                auto: 1
              }
            },
            bottom: {
              style: 'thin',
              color: {
                auto: 1
              } 
            }
          },
          fill: {
            fgColor: { rgb: 'FFFFFFFF' }
          }
        }
        // 标题的样式
        if (index === 0) {
          element.s.font.bold = true
          element.s.font.sz = 20
          element.s.fill.fgColor = { rgb: '91f367' }
        }
      }
    }
  }
  return sheet
}

// 去除字母方法，当列的数量超过25的时候会变成AA所以需要用正则匹配去掉所有的字母，剩下数字
const letter = str => {
  let result
  const reg = /[a-zA-Z]+/
  while ((result = str.match(reg))) {
    //判断str.match(reg)是否没有字母了
    str = str.replace(result[0], '') //替换掉字母  result[0] 是 str.match(reg)匹配到的字母
  }
  return str
}

function s2ab(s) {
  const buf = new ArrayBuffer(s.length)
  const view = new Uint8Array(buf)
  for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
  return buf
}

export default exportTableData